/**
 * Notes: 基础控制器
 * Ver : CCMiniCloud Framework 2.0.4 ALL RIGHTS RESERVED BY cclinUx0730 (wechat)
 * Date: 2020-09-05 04:00:00 
 */

const config = require('../../../config/config.js');
const timeUtil = require('../../helpers/time_util.js');
const util = require('../../helpers/util.js');
const dataCheck = require('../../validate/data_check.js');

const AppError = require('../../core/app_error.js');
const appCode = require('../../core/app_code.js');

class BaseController {

	constructor(route, openId, event) {

		this._route = route; // 路由
		this._openId = openId; //用户身份
		this._event = event; // 所有参数   
		this._request = event.params; //数据参数

		if (!openId) {
			console.error('OPENID is unfined');
			throw new AppError('OPENID is unfined', appCode.SVR);
		}

		let userId = openId;

		this._token = event.token || '';
		this._userId = userId;

		// 当前时间戳
		this._timestamp = timeUtil.time();
		let time = timeUtil.time('Y-M-D h:m:s');

		console.log('------------------------');
		console.log(`【${time}】【Request -- ↘↘↘】\n【↘Token = ${this._token}】\n【↘USER-ID = ${userId}】\n【↘↘IN DATA】=\n`, JSON.stringify(this._request, null, 4));

	}

	/**
	 * 初始化设置
	 * 此方法在应用程序启动时被调用，用于初始化控制器
	 */
	initSetup() {
		console.log('[BaseController] initSetup called');
		// 此处可以进行一些初始化工作
		return true;
	}

	/**
	 * 数据校验
	 * @param {*} rules 
	 */
	validateData(rules = {}) {
		let input = this._request;
		
		// 对输入数据进行预处理，避免脏数据问题
		if (input && typeof input === 'object') {
			// 过滤数据，只保留规则中定义的字段
			let filteredInput = {};
			
			for (let key in rules) {
				if (util.isDefined(input[key])) {
					filteredInput[key] = input[key];
				}
			}
			
			// 使用过滤后的数据进行校验
			try {
				const result = dataCheck.check(filteredInput, rules);
				console.log('[validateData] 验证通过，返回数据:', JSON.stringify(result));
				return result;
			} catch (e) {
				console.error('[validateData] 验证失败:', e);
				throw e;
			}
		}
		
		// 如果没有数据过滤，使用原始方法
		return dataCheck.check(input, rules);
	}

	// 取得某个具体的参数值
	getParameter(name) {
		let input = this._request;
		if (util.isDefined(input[name]))
			return input[name];
		else
			return '';
	}

	// 创建成功返回
	createSuccess(data = {}) {
		return {
			code: 0,
			msg: 'ok',
			data
		};
	}

	// 创建错误返回
	createError(msg = '操作失败', code = 500) {
		console.error('创建错误返回:', msg);
		return {
			code,
			msg,
			data: {}
		};
	}
}

module.exports = BaseController;